package com.discworld.jdownloaderx;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import javax.swing.SwingWorker;

/**
 * A utility that downloads a file from a URL.
 * @author www.codejava.net
 *
 */
//public class HttpDownloadUtility extends Thread
public class HttpDownloadUtility
{
   private String fileURL,
                  saveDir;
   
   public HttpDownloadUtility(String fileURL, String saveDir)
   {
      this.fileURL = fileURL;
      this.saveDir = saveDir;
   }
   
//   @Override
//   public void run()
//   {
//      try
//      {
//         synchronized(this) {
//         downloadFile();
//         notify();
//         }
//      } catch(IOException e)
//      {
//         // TODO Auto-generated catch block
//         e.printStackTrace();
//      }
//      
//   }

   private static final int BUFFER_SIZE = 4096;

   /**
    * Downloads a file from a URL
    * @param fileURL HTTP URL of the file to be downloaded
    * @param saveDir path of the directory to save the file
    * @throws IOException
    */
   public void downloadFile()
   {
      URL url;
      try
      {
         url = new URL(fileURL);

      HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
      int responseCode = httpConn.getResponseCode();

      // always check HTTP response code first
      if (responseCode == HttpURLConnection.HTTP_OK) 
      {
         String fileName = "";
         String disposition = httpConn.getHeaderField("Content-Disposition");
         String contentType = httpConn.getContentType();
         int contentLength = httpConn.getContentLength();

         if (disposition != null) 
         {
            // extracts file name from header field
            int index = disposition.indexOf("filename=");
            if (index > 0) 
            {
               fileName = disposition.substring(index + 10,
                     disposition.length() - 1);
            }
         } 
         else 
         {
            // extracts file name from URL
            fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1,
                  fileURL.length());
         }

         System.out.println("Content-Type = " + contentType);
         System.out.println("Content-Disposition = " + disposition);
         System.out.println("Content-Length = " + contentLength);
         System.out.println("fileName = " + fileName);

         // opens input stream from the HTTP connection
         InputStream inputStream = httpConn.getInputStream();
         String saveFilePath = saveDir + File.separator + fileName;
         
         // opens an output stream to save into file
         FileOutputStream outputStream = new FileOutputStream(saveFilePath);

         int bytesRead = -1;
         byte[] buffer = new byte[BUFFER_SIZE];
         while ((bytesRead = inputStream.read(buffer)) != -1) 
         {
            outputStream.write(buffer, 0, bytesRead);
         }

         outputStream.close();
         inputStream.close();

         System.out.println("File downloaded");
      } 
      else 
      {
         System.out.println("No file to download. Server replied HTTP code: " + responseCode);
      }
      httpConn.disconnect();
      
      } catch(MalformedURLException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch(IOException e)
      {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }      
   }

}